package robots.domain;

import java.io.Serializable;

import robots.excepcions.DineroInsuficienteException;

public class Robot implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -1516902679023205774L;
	private String nombre;
	private Integer poderTotal;
	private Integer poderEfectivo; // nivel de poder efectivo. * Poder efectivo
									// + nivel de deterioro = poder total
	private Integer nivelDeDeterioro; // nivel de poder faltante.
	private Integer danio; // representa el porcentaje del nivel de deterioro
							// con respecto al poder total.
	private Jugador jugador = null;

	public Robot(){}
	
	public Robot(String nombre, Integer poder, Jugador duenio) {
		this.nombre = nombre;
		this.poderTotal = poder;
		this.nivelDeDeterioro = 0;
		this.danio = this.calcularDanio();
		this.poderEfectivo = this.calcularPoderEfectivo();
		this.jugador = duenio;
	}

	// --------------- sets ---------------------

	public void setDanio(Integer danio) {
		this.danio = danio;
	}

	public void setPoderEfectivo(Integer poderEfectivo) {
		this.poderEfectivo = poderEfectivo;
	}

	public void setNivelDeDeterioro(Integer nivelDeDeterioro) {
		this.nivelDeDeterioro = nivelDeDeterioro;
	}

	public void setJugador(Jugador jugador) {
		this.jugador = jugador;
	}

	// ------------- gets --------------------

	public String getNombre() {
		return nombre;
	}

	public Integer getPoderTotal() {
		return poderTotal;
	}

	public Integer getPoderEfectivo() {
		return this.poderEfectivo;
	}

	public Integer getDanio() {
		return this.danio;
	}

	public Integer getPrecio() {
		return this.poderEfectivo * 50;
	}

	public Integer getNivelDeDeterioro() {
		return nivelDeDeterioro;
	}

	public Jugador getJugador() {
		if (jugador == null)
			return new Jugador("Sin Duenio", 0);
		else
			return jugador;
	}

	// --------------- functions --------------------------

	/**
	 * 
	 * @return poder efectivo del robot
	 */
	public Integer calcularPoderEfectivo() {
		return this.poderTotal * (100 - this.nivelDeDeterioro) / 100;
	}

	/**
	 * 
	 * @return daño del robot (valor en porcentaje)
	 */
	public Integer calcularDanio() {
		return this.nivelDeDeterioro * 100 / this.poderTotal;
	}

	/**
	 * Precondicion: El porcentaje debe ser positivo. El danio del robot aumenta
	 * en ese porcentaje del poder total. Por ejemplo si el robot ya tiene 50%
	 * de danio, al aplicarle aumentarDanioEn(25) el nuevo porcentaje de danio
	 * es 75. Esto modifica el poder total efectivo y el nivel de deterioro.
	 * 
	 * @param porcentaje
	 *            relativo al poder total del robot.
	 */
	public void aumnetarDanioEn(Integer porcentaje) {
		this.danio += porcentaje;
		// actualizaciones de las demas caracteristicas
		this.nivelDeDeterioro = this.danio * this.poderTotal / 100;
		this.poderEfectivo = this.calcularPoderEfectivo();
	}

	/**
	 * Precondicion: El porcentaje debe ser positivo
	 * 
	 * @param porcentaje
	 */
	public void reducirDanioEn(Integer porcentaje) {
		this.danio -= porcentaje;
		// actualizo las otras caracteristicas
		this.nivelDeDeterioro = this.danio * this.poderTotal / 100;
		this.poderEfectivo = this.calcularPoderEfectivo();
	}

	/**
	 * Precondicion: El dinero debe ser positivo.
	 * 
	 * @param dinero
	 * @return
	 */
	public boolean podesCompetirPorDinero(Integer dinero) {
		return this.getJugador().alcanzaElDineroPara(dinero);
	}

	/**
	 * Precondicion: La ganancia debe ser positiva.
	 * 
	 * @param ganancia
	 */
	public void ganaste(Integer ganancia) {
		this.getJugador().pagar(ganancia);
	}

	/**
	 * Precondicion: Los puntos deben ser positivos.
	 * 
	 * @param puntos
	 */
	public void mejorate(Integer puntos) {
		this.poderTotal += puntos;
	}

	public void nuevoDuenio(Jugador comprador) {
		this.setJugador(comprador);
	}

	public void mejorar(MejoraDeRobot mejora) throws DineroInsuficienteException {
		this.getJugador().comprarMejora(mejora);
		this.mejorate(mejora.getPuntos());
	}

	@Override
	public String toString() {
		return this.getNombre();
	}

	
}
